diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
index 65c75a6..90cce1c 100644
--- a/system/core/CodeIgniter.php
+++ b/system/core/CodeIgniter.php
@@ -16,7 +16,7 @@
 // ------------------------------------------------------------------------
 
 /**
- * System Front Controller
+ * System Initialization File
  *
  * Loads the base classes and executes the request.
  *
@@ -27,100 +27,177 @@
  * @link		http://codeigniter.com/user_guide/
  */
 
-// CI Version
-define('CI_VERSION',	'1.7.2');
+/*
+ * ------------------------------------------------------
+ *  Define the CodeIgniter Version
+ * ------------------------------------------------------
+ */
+	define('CI_VERSION', '2.0');
 
 /*
  * ------------------------------------------------------
  *  Load the global functions
  * ------------------------------------------------------
  */
-require(BASEPATH.'codeigniter/Common'.EXT);
+	require(BASEPATH.'core/Common'.EXT);
 
 /*
  * ------------------------------------------------------
  *  Load the compatibility override functions
  * ------------------------------------------------------
  */
-require(BASEPATH.'codeigniter/Compat'.EXT);
+	require(BASEPATH.'core/Compat'.EXT);
 
 /*
  * ------------------------------------------------------
  *  Load the framework constants
  * ------------------------------------------------------
  */
-require(APPPATH.'config/constants'.EXT);
+	require(APPPATH.'config/constants'.EXT);
 
 /*
  * ------------------------------------------------------
  *  Define a custom error handler so we can log PHP errors
  * ------------------------------------------------------
  */
-set_error_handler('_exception_handler');
+	set_error_handler('_exception_handler');
+	
+	if ( ! is_php('5.3'))
+	{
+		@set_magic_quotes_runtime(0); // Kill magic quotes		
+	}
 
-if ( ! is_php('5.3'))
-{
-	@set_magic_quotes_runtime(0); // Kill magic quotes
-}
+	// Set a liberal script execution time limit
+	if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
+	{
+		@set_time_limit(300);
+	}
+
+/*
+ * ------------------------------------------------------
+ *  Set the subclass_prefix
+ * ------------------------------------------------------
+ *
+ * Normally the "subclass_prefix" is set in the config file. 
+ * The subclass prefix allows CI to know if a core class is 
+ * being extended via a library in the local application
+ * "libraries" folder. Since CI allows config items to be 
+ * overriden via data set in the main index. php file, 
+ * before proceeding we need to know if a subclass_prefix 
+ * override exists.  If so, we will set this value now,
+ * before any classes are loaded
+ * Note: Since the config file data is cached it doesn't 
+ * hurt to load it here.
+ */
+	if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '') 
+	{
+		get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
+	}
 
 /*
  * ------------------------------------------------------
  *  Start the timer... tick tock tick tock...
  * ------------------------------------------------------
  */
-
-$BM =& load_class('Benchmark');
-$BM->mark('total_execution_time_start');
-$BM->mark('loading_time_base_classes_start');
+	$BM =& load_class('Benchmark', 'core');
+	$BM->mark('total_execution_time_start');
+	$BM->mark('loading_time:_base_classes_start');
 
 /*
  * ------------------------------------------------------
  *  Instantiate the hooks class
  * ------------------------------------------------------
  */
-
-$EXT =& load_class('Hooks');
+	$EXT =& load_class('Hooks', 'core');
 
 /*
  * ------------------------------------------------------
  *  Is there a "pre_system" hook?
  * ------------------------------------------------------
  */
-$EXT->_call_hook('pre_system');
+	$EXT->_call_hook('pre_system');
 
 /*
  * ------------------------------------------------------
- *  Instantiate the base classes
+ *  Instantiate the config class
  * ------------------------------------------------------
+ */ 
+	$CFG =& load_class('Config', 'core');
+
+	// Do we have any manually set config items in the index.php file?
+	if (isset($assign_to_config))
+	{	
+		$CFG->_assign_to_config($assign_to_config);
+	}
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the Unicode class
+ * ------------------------------------------------------
+ * 
+ * Note: Order here is rather important as the Unicode
+ * class needs to be used very early on, but it cannot
+ * properly determine if UTf-8 can be supported until 
+ * after the Config class is instantiated.
+ * 
  */
 
-$CFG =& load_class('Config');
-$URI =& load_class('URI');
-$RTR =& load_class('Router');
-$OUT =& load_class('Output');
+	$UNI =& load_class('Unicode', 'core');
+		
+/*
+ * ------------------------------------------------------
+ *  Instantiate the URI class
+ * ------------------------------------------------------
+ */
+	$URI =& load_class('URI', 'core');
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the routing class and set the routing
+ * ------------------------------------------------------
+ */ 
+	$RTR =& load_class('Router', 'core');
+	$RTR->_set_routing();
+	
+	// Set any routing overrides that may exist in the main index file
+	if (isset($routing))
+	{
+		$RTR->_set_overrides($routing);
+	}
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the output class
+ * ------------------------------------------------------
+ */
+	$OUT =& load_class('Output', 'core');
 
 /*
  * ------------------------------------------------------
  *	Is there a valid cache file?  If so, we're done...
  * ------------------------------------------------------
  */
-
-if ($EXT->_call_hook('cache_override') === FALSE)
-{
-	if ($OUT->_display_cache($CFG, $URI) == TRUE)
+	if ($EXT->_call_hook('cache_override') === FALSE)
 	{
-		exit;
+		if ($OUT->_display_cache($CFG, $URI) == TRUE)
+		{
+			exit;
+		}
 	}
-}
 
 /*
  * ------------------------------------------------------
- *  Load the remaining base classes
+ *  Load the Input class and sanitize globals
  * ------------------------------------------------------
  */
+	$IN	=& load_class('Input', 'core');	
 
-$IN		=& load_class('Input');
-$LANG	=& load_class('Language');
+/*
+ * ------------------------------------------------------
+ *  Load the Language class
+ * ------------------------------------------------------
+ */
+	$LANG =& load_class('Lang', 'core');
 
 /*
  * ------------------------------------------------------
@@ -131,35 +208,33 @@
  *  conditionally load different versions of the base
  *  class.  Retaining PHP 4 compatibility requires a bit of a hack.
  *
- *  Note: The Loader class needs to be included first
- *
  */
-if ( ! is_php('5.0.0'))
-{
-	load_class('Loader', FALSE);
-	require(BASEPATH.'codeigniter/Base4'.EXT);
-}
-else
-{
-	require(BASEPATH.'codeigniter/Base5'.EXT);
-}
-
-// Load the base controller class
-load_class('Controller', FALSE);
-
-// Load the local application controller
-// Note: The Router class automatically validates the controller path.  If this include fails it 
-// means that the default controller in the Routes.php file is not resolving to something valid.
-if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT))
-{
-	show_error('Unable to load your default controller.  Please make sure the controller specified in your Routes.php file is valid.');
-}
-
-include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT);
-
-// Set a mark point for benchmarking
-$BM->mark('loading_time_base_classes_end');
-
+ 	if (is_php('5.0.0') == TRUE)
+	{
+		require(BASEPATH.'core/Base5'.EXT);
+	}
+	else
+	{
+		// The Loader class needs to be included first when running PHP 4.x
+		load_class('Loader', 'core');
+		require(BASEPATH.'core/Base4'.EXT);
+	}
+	
+	// Load the base controller class
+	require BASEPATH.'core/Controller'.EXT;
+	
+	// Load the local application controller
+	// Note: The Router class automatically validates the controller path using the router->_validate_request().  
+	// If this include fails it means that the default controller in the Routes.php file is not resolving to something valid.
+	if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT))
+	{
+		show_error('Unable to load your default controller.  Please make sure the controller specified in your Routes.php file is valid.');
+	}
+	
+	include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT);
+	
+	// Set a mark point for benchmarking
+	$BM->mark('loading_time:_base_classes_end');
 
 /*
  * ------------------------------------------------------
@@ -170,54 +245,48 @@
  *  loader class can be called via the URI, nor can
  *  controller functions that begin with an underscore
  */
-$class  = $RTR->fetch_class();
-$method = $RTR->fetch_method();
-
-if ( ! class_exists($class)
-	OR $method == 'controller'
-	OR strncmp($method, '_', 1) == 0
-	OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))
-	)
-{
-	show_404("{$class}/{$method}");
-}
+	$class  = $RTR->fetch_class();
+	$method = $RTR->fetch_method();
+	
+	if ( ! class_exists($class)
+		OR $method == 'controller'
+		OR strncmp($method, '_', 1) == 0
+		OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))
+		)
+	{
+		show_404("{$class}/{$method}");
+	}
 
 /*
  * ------------------------------------------------------
  *  Is there a "pre_controller" hook?
  * ------------------------------------------------------
  */
-$EXT->_call_hook('pre_controller');
+	$EXT->_call_hook('pre_controller');
 
 /*
  * ------------------------------------------------------
- *  Instantiate the controller and call requested method
+ *  Instantiate the requested controller
  * ------------------------------------------------------
  */
-
-// Mark a start point so we can benchmark the controller
-$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
-
-$CI = new $class();
-
-// Is this a scaffolding request?
-if ($RTR->scaffolding_request === TRUE)
-{
-	if ($EXT->_call_hook('scaffolding_override') === FALSE)
-	{
-		$CI->_ci_scaffolding();
-	}
-}
-else
-{
-	/*
-	 * ------------------------------------------------------
-	 *  Is there a "post_controller_constructor" hook?
-	 * ------------------------------------------------------
-	 */
-	$EXT->_call_hook('post_controller_constructor');
+	// Mark a start point so we can benchmark the controller
+	$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
 	
-	// Is there a "remap" function?
+	$CI = new $class();
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "post_controller_constructor" hook?
+ * ------------------------------------------------------
+ */
+	$EXT->_call_hook('post_controller_constructor');
+
+/*
+ * ------------------------------------------------------
+ *  Call the requested method
+ * ------------------------------------------------------
+ */
+	// Is there a "remap" function? If so, we call it instead
 	if (method_exists($CI, '_remap'))
 	{
 		$CI->_remap($method);
@@ -232,48 +301,47 @@
 		}
 
 		// Call the requested method.
-		// Any URI segments present (besides the class/function) will be passed to the method for convenience
-		call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
+		// Any URI segments present (besides the class/function) will be passed to the method for convenience		
+		call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));		
 	}
-}
 
-// Mark a benchmark end point
-$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
+	
+	// Mark a benchmark end point
+	$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
 
 /*
  * ------------------------------------------------------
  *  Is there a "post_controller" hook?
  * ------------------------------------------------------
  */
-$EXT->_call_hook('post_controller');
+	$EXT->_call_hook('post_controller');
 
 /*
  * ------------------------------------------------------
  *  Send the final rendered output to the browser
  * ------------------------------------------------------
  */
-
-if ($EXT->_call_hook('display_override') === FALSE)
-{
-	$OUT->_display();
-}
-
+	if ($EXT->_call_hook('display_override') === FALSE)
+	{
+		$OUT->_display();
+	}
+	
 /*
  * ------------------------------------------------------
  *  Is there a "post_system" hook?
  * ------------------------------------------------------
  */
-$EXT->_call_hook('post_system');
+	$EXT->_call_hook('post_system');
 
 /*
  * ------------------------------------------------------
  *  Close the DB connection if one exists
  * ------------------------------------------------------
  */
-if (class_exists('CI_DB') AND isset($CI->db))
-{
-	$CI->db->close();
-}
+	if (class_exists('CI_DB') AND isset($CI->db))
+	{
+		$CI->db->close();
+	}
 
 
 /* End of file CodeIgniter.php */
